<!DOCTYPE html>
<html>
<head data-suburl="">
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
	
		<meta name="author" content="diogo" />
		<meta name="description" content="gnu-social - GNU social is a social communication software used in federated social networks. It is widely supported and has a large userbase. It is already used by the Free Software Foundation." />
		<meta name="keywords" content="go, git, self-hosted, gogs">
	
	<meta name="referrer" content="no-referrer" />
	<meta name="_csrf" content="pZsngCZUGpJ2KgKnqXo_SF_30Ow6MTYwNDc5MjM3Mjc3MjYxNTY2Ng==" />
	<meta name="_suburl" content="" />
	
	
	
		<meta property="og:url" content="https://notabug.org/diogo/gnu-social" />
		<meta property="og:type" content="object" />
		<meta property="og:title" content="diogo/gnu-social">
		<meta property="og:description" content="GNU social is a social communication software used in federated social networks. It is widely supported and has a large userbase. It is already used by the Free Software Foundation.">
		<meta property="og:image" content="https://notabug.org/avatars/12290" />
	

	<link rel="shortcut icon" href="/img/favicon.png" />

	<script src="/js/jquery-1.11.3.min.js"></script>
	<script src="/js/libs/jquery.are-you-sure.js"></script>
        <link href="/img/icon-48.ico" rel="icon" type="image/x-icon" />
        <link href="/img/icon-60.png" rel="apple-touch-icon">
        <link href="/img/icon-76.png" rel="apple-touch-icon" sizes="76x76">
        <link href="/img/icon-120.png" rel="apple-touch-icon" sizes="120x120">
        <link href="/img/icon-152.png" rel="apple-touch-icon" sizes="152x152">
        <link href="/img/icon-240.png" rel="apple-touch-icon" sizes="240x240">

	<link rel="stylesheet" href="/assets/font-awesome-4.6.3/css/font-awesome.min.css">
	<link rel="stylesheet" href="/assets/octicons-4.3.0/octicons.min.css">

	
	

	

	
	<link rel="stylesheet" href="/css/semantic-2.2.13.min.css">
	<link rel="stylesheet" href="/css/gogs.css?v=6fc9e85aa88133794d3434ea74aa557a">
	<link rel="stylesheet" href="/css/notabug.css">

	
	<script src="/js/semantic-2.2.13.min.js"></script>
	<script src="/js/gogs.js?v=6fc9e85aa88133794d3434ea74aa557a"></script>

	<title>Please avoid using MySQL 8.0 feature for many shared web hosting - NotABug.org: Free code hosting</title>

	<meta name="theme-color" content="#428bca">

	


<noscript><style>.nojs-popup:hover > .menu { display: block ; }</style></noscript>


</head>
<body>
	<div class="full height">
		<noscript>Please enable JavaScript in your browser!</noscript>

		
			<div id="header-div" class="following bar light">
				<div class="ui container">
					<div class="ui grid">
						<div class="column">
							<div class="ui top secondary menu">
								<a class="item brand" href="/">
									<img class="ui mini image" src="/img/favicon.png">
								</a>

								
									<a class="item" href="/">Home</a>
								

								<a class="item" href="/explore/repos">Explore</a>
								

								



									<a class="notabug-item item" href="/help" rel="noreferrer">Help</a>




									<div class="right menu">
										
											<a class="item" href="/user/sign_up">
												<i class="octicon octicon-person"></i> Register
											</a>
										
										<a class="item" href="/user/login?redirect_to=%2fdiogo%2fgnu-social%2fissues%2f206">
											<i class="octicon octicon-sign-in"></i> Sign In
										</a>
									</div>

								
							</div>
						</div>
					</div>
				</div>
			</div>
		


<div class="repository view issue pull">
	<div class="header-wrapper">

	<div class="ui container">
		<div class="ui vertically padded grid head">
			<div class="column">
				<div class="ui header">
					<div class="ui huge breadcrumb">
						<i class="mega-octicon octicon-repo"></i>
						<a href="/diogo">diogo</a>
						<div class="divider"> / </div>
						<a href="/diogo/gnu-social">gnu-social</a>
						
						
					</div>

					
						<div class="ui right">
							<div class="ui labeled button" tabindex="0">
								<a class="ui basic button" href="/diogo/gnu-social/action/watch?redirect_to=%2fdiogo%2fgnu-social%2fissues%2f206">
									<i class="icon fa-eye-slash"></i>Watch
								</a>
								<a class="ui basic label" href="/diogo/gnu-social/watchers">
									9
								</a>
							</div>
							<div class="ui labeled button" tabindex="0">
								<a class="ui basic button" href="/diogo/gnu-social/action/star?redirect_to=%2fdiogo%2fgnu-social%2fissues%2f206">
									<i class="icon fa-star-o"></i>Star
								</a>
								<a class="ui basic label" href="/diogo/gnu-social/stars">
									22
								</a>
							</div>
							
								<div class="ui labeled button" tabindex="0">
									<a class="ui basic button " href="/repo/fork/25974">
										<i class="octicon octicon-repo-forked"></i>Fork
									</a>
									<a class="ui basic label" href="/diogo/gnu-social/forks">
										21
									</a>
								</div>
							
						</div>
					
				</div>
			</div>
		</div>
	</div>


	<div class="ui tabs container">
		<div class="ui tabular menu navbar">
			
				<a class=" item" href="/diogo/gnu-social">
					<i class="octicon octicon-file-text"></i> Files
				</a>
			
			
				<a class="active item" href="/diogo/gnu-social/issues">
					<i class="octicon octicon-issue-opened"></i> Issues <span class="ui blue small label">73</span>
				</a>
			
			
				<a class=" item" href="/diogo/gnu-social/pulls">
					<i class="octicon octicon-git-pull-request"></i> Pull Requests <span class="ui blue small label">3</span>
				</a>
			
			
				<a class=" item" href="/diogo/gnu-social/wiki">
					<i class="octicon octicon-book"></i> Wiki
				</a>
			
			
		</div>
	</div>
	<div class="ui tabs divider"></div>

</div>

	<div class="ui container">
		<div class="navbar">
			<div class="ui compact small menu">
	<a class=" item" href="/diogo/gnu-social/labels">Labels</a>
	<a class=" item" href="/diogo/gnu-social/milestones">Milestones</a>
</div>

			<div class="ui right">
				
					<a class="ui green button" href="/diogo/gnu-social/issues/new">New Issue</a>
				
			</div>
		</div>
		<div class="ui divider"></div>
		
			<div>
				<div class="ui grid">
	
	
		<div class="sixteen wide column title">
	<div class="ui grid">
		<h1 class="twelve wide column">
			<span class="index">#206</span> <span id="issue-title" class="has-emoji">Please avoid using MySQL 8.0 feature for many shared web hosting</span>
			<div id="edit-title-input" class="ui input" style="display: none">
				<input value="Please avoid using MySQL 8.0 feature for many shared web hosting">
			</div>
		</h1>
		
	</div>
	
		<div class="ui green large label"><i class="octicon octicon-issue-opened"></i> Open</div>
	

	
		
		<span class="time-desc">
			
				opened <span class="time-since" title="Sat, 05 Sep 2020 11:23:37 UTC">2 months ago</span> by <a href="/senooken">senooken</a>
			
			·
			11 comments
		</span>
	
	<div class="ui divider"></div>
</div>

	

	
	<div class="twelve wide column comment-list">
		<ui class="ui comments">
			<div class="comment">
				<a class="avatar" href="/senooken">
					<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
				</a>
				<div class="content">
					<div class="ui top attached header">
						<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issue-65591"><span class="time-since" title="Sat, 05 Sep 2020 11:23:37 UTC">2 months ago</span></a></span>
						<div class="ui right actions">
							
						</div>
					</div>
					<div class="ui attached segment">
						<div class="render-content markdown has-emoji">
							
								<p>I checked latest commit ( <code><a href="https://notabug.org/diogo/gnu-social/commit/4884a97223d61e516a645ab3ae4b6ac009c12b63" rel="nofollow">4884a97223</a></code>).</p>

<p>After that I cannot access my timeline due to a DB error.</p>

<p>This commit requires a MySQL 8.0 feature <a href="https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html" rel="nofollow">JSON_TABLE</a> (MySQL 8.0.4 or later) in <code>classes/Memcached_DataObject.php</code>.</p>

<p>My <a href="https://social.senooken.jp/senooken" rel="nofollow">GNU social server</a> is hosted by a shared web hosting service (MySQL 5.7, PHP 7.3).</p>

<p>So I will try fixing this by moving <code>case &#39;mysql&#39;:</code> below <code>case &#39;mariadb&#39;:</code>.</p>

<p>But the next <code>WITH</code> and <code>VALUES</code> clauses also require MySQL 8.0 (<a href="https://mariadb.com/kb/en/table-value-constructors/" rel="nofollow">MariaDB 10.3.3 or later</a>).</p>

<ul>
<li>WITH: <a href="https://dev.mysql.com/doc/refman/8.0/en/with.html" rel="nofollow">https://dev.mysql.com/doc/refman/8.0/en/with.html</a></li>
<li>VALUES: <a href="https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-19.html" rel="nofollow">https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-19.html</a></li>
</ul>

<p>I am not familiar with SQL.</p>

<p>Could you rewrite this code without the <code>WITH</code> and <code>VALUES</code> clauses, <a href="/XRevan86" rel="nofollow">@XRevan86</a>?</p>

<p>Many shared web hosting services use MySQL 5.6 or 5.7 (MariaDB 10.1 or 10.2) for <a href="https://wordpress.org/about/requirements/" rel="nofollow">WordPress requirements</a>.</p>

<p>Would we avoid using a MySQL 8.0 feature?</p>

							
						</div>
						<div class="raw-content hide">I checked latest commit (https://notabug.org/diogo/gnu-social/commit/4884a97223d61e516a645ab3ae4b6ac009c12b63).

After that I cannot access my timeline due to a DB error.

This commit requires a MySQL 8.0 feature [JSON_TABLE](https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html) (MySQL 8.0.4 or later) in `classes/Memcached_DataObject.php`.

My [GNU social server](https://social.senooken.jp/senooken) is hosted by a shared web hosting service (MySQL 5.7, PHP 7.3).

So I will try fixing this by moving `case &#39;mysql&#39;:` below `case &#39;mariadb&#39;:`. 

But the next `WITH` and `VALUES` clauses also require MySQL 8.0 ([MariaDB 10.3.3 or later](https://mariadb.com/kb/en/table-value-constructors/)).

- WITH: https://dev.mysql.com/doc/refman/8.0/en/with.html
- VALUES: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-19.html

I am not familiar with SQL.

Could you rewrite this code without the `WITH` and `VALUES` clauses, @XRevan86?

Many shared web hosting services use MySQL 5.6 or 5.7 (MariaDB 10.1 or 10.2) for [WordPress requirements](https://wordpress.org/about/requirements/).

Would we avoid using a MySQL 8.0 feature?</div>
						<div class="edit-content-zone hide" data-write="issue-65591-write" data-preview="issue-65591-preview" data-update-url="/diogo/gnu-social/issues/206/content" data-context="/diogo/gnu-social"></div>
					</div>
					
				</div>
			</div>

			
				

				
				
					<div class="comment" id="issuecomment-20938">
						<a class="avatar" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/XRevan86">XRevan86</a> commented <a href="#issuecomment-20938"><span class="time-since" title="Sat, 05 Sep 2020 14:34:32 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Collaborator
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>This commit requires a MySQL 8.0 feature JSON_TABLE</p>
</blockquote>

<p>Just for clarity, it is planned to be added in MariaDB 10.6. I&#39;ll change the version condition when that is a certainty.</p>

<blockquote>
<p>But next WITH and VALUES clauses also require MySQL 8.0</p>
</blockquote>

<p><code>WITH</code> is available since MariaDB 10.2, <code>VALUES</code> – since MariaDB 10.3.<br>
In Oracle MySQL they are indeed only present starting with MySQL 8.0.</p>

<blockquote>
<p>So I will try fixing this by moving <code>case &#39;mysql&#39;:</code> to below <code>case &#39;mariadb&#39;:</code>.</p>
</blockquote>

<p>That will not work even with Oracle MySQL 8.0, their implementation of <code>VALUES</code> picks a different subset of the standard (requires the optional <code>ROW</code> keyword, while MariaDB and PostgreSQL don&#39;t accept it at all).</p>

<blockquote>
<p>for WordPress requirements</p>
</blockquote>

<p>Are you saying that shared hostings won&#39;t move a muscle until WordPress forces them to by moving the bar higher?<br>
Because MySQL 5.7 is increasingly becoming more and more of an antique by the year.</p>

<blockquote>
<p>Would we avoid using a MySQL 8.0 feature?</p>
</blockquote>

<p>I need <code>WITH</code> here at least to improve performance of the heavily used method <code>multiGet</code>.</p>

									
								</div>
								<div class="raw-content hide">&gt; This commit requires a MySQL 8.0 feature JSON_TABLE

Just for clarity, it is planned to be added in MariaDB 10.6. I&#39;ll change the version condition when that is a certainty.
&gt; But next WITH and VALUES clauses also require MySQL 8.0

```WITH``` is available since MariaDB 10.2, ```VALUES``` – since MariaDB 10.3.  
In Oracle MySQL they are indeed only present starting with MySQL 8.0.  
&gt; So I will try fixing this by moving ```case &#39;mysql&#39;:``` to below ```case &#39;mariadb&#39;:```.

That will not work even with Oracle MySQL 8.0, their implementation of ```VALUES``` picks a different subset of the standard (requires the optional ```ROW``` keyword, while MariaDB and PostgreSQL don&#39;t accept it at all).  
&gt; for WordPress requirements

Are you saying that shared hostings won&#39;t move a muscle until WordPress forces them to by moving the bar higher?  
Because MySQL 5.7 is increasingly becoming more and more of an antique by the year. 
&gt; Would we avoid using a MySQL 8.0 feature?

I need ```WITH``` here at least to improve performance of the heavily used method ```multiGet```.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20938-write" data-preview="issuecomment-20938-preview" data-update-url="/diogo/gnu-social/comments/20938" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20949">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-20949"><span class="time-since" title="Sun, 06 Sep 2020 07:04:27 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>I need WITH here at least to improve performance of the heavily used method multiGet.</p>
</blockquote>

<p>OK. Performance is important. And Thanks for telling me to differ logic for MariaDB and MySQL query.</p>

<p>So I created patch for MySQL 5.7 (diff1.patch). Would you check it? My GNU social server is well done by this patch in latest commit.</p>

<blockquote>
<p>Are you saying that shared hostings won&#39;t move a muscle until WordPress forces them to by moving the bar higher? Because MySQL 5.7 is increasingly becoming more and more of an antique by the year.</p>
</blockquote>

<p>Here is Oracle MySQL support policy (p. 21) (<a href="http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf" rel="nofollow">http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf</a>).</p>

<p>EOL of MySQL 5.7 = Oct 2023, 5.6=Feb 2021.</p>

<p>Many shared hosting is based on WordPress requirements. And WordPress requirements is based on vendor EOL.</p>

<p>In Japan, there is no shared hosting for supporting MySQL 8.0. Do you know shared hosting for supporting MySQL 8.0?</p>

<p>MySQL 5.7 will be used until Oct 2023 for EOL (for 3 years remainig). I think drop out of MySQL 5.7 is too early now.</p>

<p>If it is important for using latest DB feature, would we prepare for non latest DB logic?</p>

<p>For example, prepare <code>$config[&#39;db&#39;][&#39;version&#39;]</code> item in <code>config.php</code>. Then if <code>$config[&#39;db&#39;][&#39;version&#39;]</code> is specified and version is not latest, run for compatible SQL by if statement.</p>

<p>This gives choice to user to use GNU social on running old (cheap) shared web hosting.</p>

									
								</div>
								<div class="raw-content hide">&gt; I need WITH here at least to improve performance of the heavily used method multiGet.

OK. Performance is important. And Thanks for telling me to differ logic for MariaDB and MySQL query.

So I created patch for MySQL 5.7 (diff1.patch). Would you check it? My GNU social server is well done by this patch in latest commit.

&gt; Are you saying that shared hostings won&#39;t move a muscle until WordPress forces them to by moving the bar higher? Because MySQL 5.7 is increasingly becoming more and more of an antique by the year.

Here is Oracle MySQL support policy (p. 21) (http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf).

EOL of MySQL 5.7 = Oct 2023, 5.6=Feb 2021.

Many shared hosting is based on WordPress requirements. And WordPress requirements is based on vendor EOL.

In Japan, there is no shared hosting for supporting MySQL 8.0. Do you know shared hosting for supporting MySQL 8.0?

MySQL 5.7 will be used until Oct 2023 for EOL (for 3 years remainig). I think drop out of MySQL 5.7 is too early now.

If it is important for using latest DB feature, would we prepare for non latest DB logic?

For example, prepare `$config[&#39;db&#39;][&#39;version&#39;]` item in `config.php`. Then if `$config[&#39;db&#39;][&#39;version&#39;]` is specified and version is not latest, run for compatible SQL by if statement.

This gives choice to user to use GNU social on running old (cheap) shared web hosting.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20949-write" data-preview="issuecomment-20949-preview" data-update-url="/diogo/gnu-social/comments/20949" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20950">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-20950"><span class="time-since" title="Sun, 06 Sep 2020 07:07:58 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<p>It seems uploading feature is not work in NotABug.org.... So here is my patch.</p>

<pre><code>diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 0d22eb8628..adce5f6a88 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -163,17 +163,27 @@ class Memcached_DataObject extends Safe_DataObject
                 break;
             case &#39;mysql&#39;:
             default:
+                // Delivers an empty set
+                if (count($vals_escaped) == 0) {
+                    $vals_escaped[] = &#39;NULL&#39;;
+                }
+                $subquery = &#34;&#34;;
+                foreach ($vals_escaped as $i =&gt; $val) {
+                    if ($i == 0) {
+                        $subquery = &#34;SELECT ${val} AS ${keyCol},  ${i} AS ${keyCol}_pos&#34; ;
+                    } else {
+                        $subquery .= &#34; UNION ALL SELECT ${val}, ${i}&#34;;
+                    }
+                }
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
                     &lt;&lt;&lt;END
-                    RIGHT JOIN JSON_TABLE(
-                      JSON_ARRAY(%s), &#39;$[*]&#39; COLUMNS (
-                        {$keyCol} {$vals_cast_type} PATH &#39;$&#39;,
-                        {$keyCol}_pos FOR ORDINALITY
-                      )
+                    RIGHT JOIN (
+                      %s
                     ) AS {$join_tablename} USING ({$keyCol})
                     END,
-                    implode(&#39;,&#39;, $vals_escaped)
+                    $subquery
                 );
+                break;
         }
 
         // Filters both NULLs requested and non-matching NULLs
</code></pre>

									
								</div>
								<div class="raw-content hide">It seems uploading feature is not work in NotABug.org.... So here is my patch.

```
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 0d22eb8628..adce5f6a88 100644
--- a/classes/Memcached_DataObject.php
&#43;&#43;&#43; b/classes/Memcached_DataObject.php
@@ -163,17 &#43;163,27 @@ class Memcached_DataObject extends Safe_DataObject
                 break;
             case &#39;mysql&#39;:
             default:
&#43;                // Delivers an empty set
&#43;                if (count($vals_escaped) == 0) {
&#43;                    $vals_escaped[] = &#39;NULL&#39;;
&#43;                }
&#43;                $subquery = &#34;&#34;;
&#43;                foreach ($vals_escaped as $i =&gt; $val) {
&#43;                    if ($i == 0) {
&#43;                        $subquery = &#34;SELECT ${val} AS ${keyCol},  ${i} AS ${keyCol}_pos&#34; ;
&#43;                    } else {
&#43;                        $subquery .= &#34; UNION ALL SELECT ${val}, ${i}&#34;;
&#43;                    }
&#43;                }
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
                     &lt;&lt;&lt;END
-                    RIGHT JOIN JSON_TABLE(
-                      JSON_ARRAY(%s), &#39;$[*]&#39; COLUMNS (
-                        {$keyCol} {$vals_cast_type} PATH &#39;$&#39;,
-                        {$keyCol}_pos FOR ORDINALITY
-                      )
&#43;                    RIGHT JOIN (
&#43;                      %s
                     ) AS {$join_tablename} USING ({$keyCol})
                     END,
-                    implode(&#39;,&#39;, $vals_escaped)
&#43;                    $subquery
                 );
&#43;                break;
         }
 
         // Filters both NULLs requested and non-matching NULLs
```</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20950-write" data-preview="issuecomment-20950-preview" data-update-url="/diogo/gnu-social/comments/20950" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20952">
						<a class="avatar" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/XRevan86">XRevan86</a> commented <a href="#issuecomment-20952"><span class="time-since" title="Sun, 06 Sep 2020 14:14:31 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Collaborator
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>EOL of MySQL 5.7 = Oct 2023, 5.6=Feb 2021.</p>
</blockquote>

<p>EOL for CentOS 7 = Jun 2024, CentOS 6 = Nov 2020.<br>
So they have very long support periods. Doesn&#39;t mean anyone should continue using them with a clear conscience.</p>

<blockquote>
<p>Many shared hosting is based on WordPress requirements. And WordPress requirements is based on vendor EOL.</p>
</blockquote>

<p>WordPress supports the latest MariaDB and Oracle MySQL fine, it&#39;s not against WordPress requirements to use something not ancient.</p>

<blockquote>
<p>WordPress also works with PHP 5.6.20+ and MySQL 5.0+</p>
</blockquote>

<p>And they also write this. And latest GNU social won&#39;t work on PHP 5.6 and MySQL 5.0, that&#39;s just how it is.</p>

<blockquote>
<p>In Japan, there is no shared hosting for supporting MySQL 8.0. Do you know shared hosting for supporting MySQL 8.0?</p>
</blockquote>

<p>Admittedly, I am no expert on shared hosting providers.<br>
And I should point out that Oracle MySQL 8.0 is not officially supported by GNU social.<br>
The currently supported DBMS are: PostgreSQL 11+ and MariaDB 10.3+.</p>

<p>I looked around the shared hosting provider of your choice, GMO DigiRock, and couldn&#39;t even find evidence of Oracle MySQL 5.7 there. They don&#39;t disclose their offerings much.<br>
I do see that they have PHP 7.4 though, so I don&#39;t know why you picked PHP 7.3.<br>
GNU social requires PHP 7.3+, it&#39;s not the maximum, it&#39;s the minimum. Same with WordPress, really.</p>

<p>Either way, I&#39;m sure there are plenty of shared hostings that do provide something newer than Oracle MySQL 5.7.<br>
There is this page: <a href="https://mariadb.com/kb/en/web-hosting-providers-offering-mariadb/" rel="nofollow">Web Hosting Providers Offering MariaDB</a> for one thing.</p>

<p>Fixed up your patch:</p>

<pre><code class="language-diff">--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -100,9 +100,18 @@ class Memcached_DataObject extends Safe_DataObject
         $db_type = common_config(&#39;db&#39;, &#39;type&#39;);
         if ($db_type === &#39;mysql&#39;) {
             $tmp_obj = new $cls();
-            $tmp_obj-&gt;query(&#39;SELECT 0 /*M! + 1 */ AS is_mariadb;&#39;);
-            if ($tmp_obj-&gt;fetch() &amp;&amp; $tmp_obj-&gt;is_mariadb) {
-                $db_type = &#39;mariadb&#39;;
+            $tmp_obj-&gt;query(
+                &lt;&lt;&lt;&#39;END&#39;
+                SELECT (0 /*M! + 1 */) &lt;&gt; 0 AS is_mariadb,
+                    (0 /*!80004 + 1 */ /*M!100303 + 1 */) = 0 AS is_old_mysql;
+                END
+            );
+            if ($tmp_obj-&gt;fetch()) {
+                if ($tmp_obj-&gt;is_old_mysql) {
+                    $db_type = &#39;old_mysql&#39;;
+                } elseif ($tmp_obj-&gt;is_mariadb) {
+                    $db_type = &#39;mariadb&#39;;
+                }
             }
         }
 
@@ -116,11 +125,17 @@ class Memcached_DataObject extends Safe_DataObject
             } else {
                 $val_escaped = &#34;&#39;{$obj-&gt;escape($val)}&#39;&#34;;
             }
-            if ($db_type !== &#39;mariadb&#39;) {
-                $vals_escaped[] = $val_escaped;
-            } else {
-                // A completely different approach for MariaDB (see below)
+            if ($db_type === &#39;mariadb&#39;) {
                 $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
+            } elseif ($db_type === &#39;old_mysql&#39;) {
+                if ($i == 0) {
+                    $vals_escaped[] = &#34;SELECT {$val_escaped} AS {$keyCol}, &#34;
+                                    . &#34;{$i} AS {$keyCol}_pos&#34;;
+                } else {
+                    $vals_escaped[] = &#34;SELECT {$val_escaped},{$i}&#34;;
+                }
+            } else {
+                $vals_escaped[] = $val_escaped;
             }
         }
 
@@ -164,6 +179,19 @@ class Memcached_DataObject extends Safe_DataObject
                     implode(&#39;,&#39;, $vals_escaped)
                 );
                 break;
+            case &#39;old_mysql&#39;:
+                // Delivers an empty set
+                if (count($vals_escaped) == 0) {
+                    $vals_escaped[] = &#34;SELECT NULL AS {$keyCol}, &#34;
+                                    . &#34;0 AS {$keyCol}_pos LIMIT 0&#34;;
+                }
+                $obj-&gt;_join = &#34;\n&#34; . sprintf(
+                    &#34;{$join_keyword} (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
+                    implode(&#39; UNION ALL &#39;, $vals_escaped)
+                );
+                break;
             case &#39;mysql&#39;:
             default:
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
</code></pre>

<p>But the problem with that approach is that it&#39;s pretty lengthy and it is even more verbose than what was there before, because… well, <code>SELECT 1 AS id, 0 AS id_pos UNION ALL SELECT 2,1 UNION ALL SELECT 3,2 UNION ALL SELECT 4,3 UNION ALL SELECT 5,4</code> for <code>VALUES (1,0),(2,1),(3,2),(4,3),(5,4)</code> or <code>JSON_ARRAY(1,2,3,4,5)</code>.</p>

									
								</div>
								<div class="raw-content hide">&gt; EOL of MySQL 5.7 = Oct 2023, 5.6=Feb 2021.

EOL for CentOS 7 = Jun 2024, CentOS 6 = Nov 2020.  
So they have very long support periods. Doesn&#39;t mean anyone should continue using them with a clear conscience.

&gt; Many shared hosting is based on WordPress requirements. And WordPress requirements is based on vendor EOL.

WordPress supports the latest MariaDB and Oracle MySQL fine, it&#39;s not against WordPress requirements to use something not ancient.  
&gt; WordPress also works with PHP 5.6.20&#43; and MySQL 5.0&#43;

And they also write this. And latest GNU social won&#39;t work on PHP 5.6 and MySQL 5.0, that&#39;s just how it is.
&gt; In Japan, there is no shared hosting for supporting MySQL 8.0. Do you know shared hosting for supporting MySQL 8.0?

Admittedly, I am no expert on shared hosting providers.  
And I should point out that Oracle MySQL 8.0 is not officially supported by GNU social.  
The currently supported DBMS are: PostgreSQL 11&#43; and MariaDB 10.3&#43;.

I looked around the shared hosting provider of your choice, GMO DigiRock, and couldn&#39;t even find evidence of Oracle MySQL 5.7 there. They don&#39;t disclose their offerings much.  
I do see that they have PHP 7.4 though, so I don&#39;t know why you picked PHP 7.3.  
GNU social requires PHP 7.3&#43;, it&#39;s not the maximum, it&#39;s the minimum. Same with WordPress, really.

Either way, I&#39;m sure there are plenty of shared hostings that do provide something newer than Oracle MySQL 5.7.  
There is this page: [Web Hosting Providers Offering MariaDB](https://mariadb.com/kb/en/web-hosting-providers-offering-mariadb/) for one thing.

Fixed up your patch:
```diff
--- a/classes/Memcached_DataObject.php
&#43;&#43;&#43; b/classes/Memcached_DataObject.php
@@ -100,9 &#43;100,18 @@ class Memcached_DataObject extends Safe_DataObject
         $db_type = common_config(&#39;db&#39;, &#39;type&#39;);
         if ($db_type === &#39;mysql&#39;) {
             $tmp_obj = new $cls();
-            $tmp_obj-&gt;query(&#39;SELECT 0 /*M! &#43; 1 */ AS is_mariadb;&#39;);
-            if ($tmp_obj-&gt;fetch() &amp;&amp; $tmp_obj-&gt;is_mariadb) {
-                $db_type = &#39;mariadb&#39;;
&#43;            $tmp_obj-&gt;query(
&#43;                &lt;&lt;&lt;&#39;END&#39;
&#43;                SELECT (0 /*M! &#43; 1 */) &lt;&gt; 0 AS is_mariadb,
&#43;                    (0 /*!80004 &#43; 1 */ /*M!100303 &#43; 1 */) = 0 AS is_old_mysql;
&#43;                END
&#43;            );
&#43;            if ($tmp_obj-&gt;fetch()) {
&#43;                if ($tmp_obj-&gt;is_old_mysql) {
&#43;                    $db_type = &#39;old_mysql&#39;;
&#43;                } elseif ($tmp_obj-&gt;is_mariadb) {
&#43;                    $db_type = &#39;mariadb&#39;;
&#43;                }
             }
         }
 
@@ -116,11 &#43;125,17 @@ class Memcached_DataObject extends Safe_DataObject
             } else {
                 $val_escaped = &#34;&#39;{$obj-&gt;escape($val)}&#39;&#34;;
             }
-            if ($db_type !== &#39;mariadb&#39;) {
-                $vals_escaped[] = $val_escaped;
-            } else {
-                // A completely different approach for MariaDB (see below)
&#43;            if ($db_type === &#39;mariadb&#39;) {
                 $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
&#43;            } elseif ($db_type === &#39;old_mysql&#39;) {
&#43;                if ($i == 0) {
&#43;                    $vals_escaped[] = &#34;SELECT {$val_escaped} AS {$keyCol}, &#34;
&#43;                                    . &#34;{$i} AS {$keyCol}_pos&#34;;
&#43;                } else {
&#43;                    $vals_escaped[] = &#34;SELECT {$val_escaped},{$i}&#34;;
&#43;                }
&#43;            } else {
&#43;                $vals_escaped[] = $val_escaped;
             }
         }
 
@@ -164,6 &#43;179,19 @@ class Memcached_DataObject extends Safe_DataObject
                     implode(&#39;,&#39;, $vals_escaped)
                 );
                 break;
&#43;            case &#39;old_mysql&#39;:
&#43;                // Delivers an empty set
&#43;                if (count($vals_escaped) == 0) {
&#43;                    $vals_escaped[] = &#34;SELECT NULL AS {$keyCol}, &#34;
&#43;                                    . &#34;0 AS {$keyCol}_pos LIMIT 0&#34;;
&#43;                }
&#43;                $obj-&gt;_join = &#34;\n&#34; . sprintf(
&#43;                    &#34;{$join_keyword} (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
&#43;                    implode(&#39; UNION ALL &#39;, $vals_escaped)
&#43;                );
&#43;                break;
             case &#39;mysql&#39;:
             default:
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
```

But the problem with that approach is that it&#39;s pretty lengthy and it is even more verbose than what was there before, because… well, ```SELECT 1 AS id, 0 AS id_pos UNION ALL SELECT 2,1 UNION ALL SELECT 3,2 UNION ALL SELECT 4,3 UNION ALL SELECT 5,4``` for ```VALUES (1,0),(2,1),(3,2),(4,3),(5,4)``` or ```JSON_ARRAY(1,2,3,4,5)```.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20952-write" data-preview="issuecomment-20952-preview" data-update-url="/diogo/gnu-social/comments/20952" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20957">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-20957"><span class="time-since" title="Sun, 06 Sep 2020 23:19:24 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>WordPress supports the latest MariaDB and Oracle MySQL fine, it&#39;s not against WordPress requirements to use something not ancient.</p>
</blockquote>

<p>You are right. But WordPress support non latest DB, so shared hosting providers may use non latest DB for their convinience.</p>

<p>My shared hosting provider GMO DigiRock (CORESERVER) show them spec in here (<a href="https://www.coreserver.jp/spec/" rel="nofollow">https://www.coreserver.jp/spec/</a>). They support MySQL 5.7 and PostgreSQL 9.6.</p>

<p>I selected PHP 7.3 for more stability than PHP 7.4.</p>

<blockquote>
<p>Either way, I&#39;m sure there are plenty of shared hostings that do provide something newer than Oracle MySQL 5.7. There is this page: Web Hosting Providers Offering MariaDB for one thing.</p>
</blockquote>

<p>Thanks for information. I saw MariaDB global supporting provider  in first time.</p>

<p>MariaDB is forked from MySQL 5.5. And non latest version, MySQL and MariaDB is high compatible.</p>

<p>GNU social v1.x supports MariaDB 5+, so I wish keep compatibility for non latest DB...</p>

<p>I understand lengthy and less performance is not good for developer, but I think it is also important for supporting non latest DB for user.</p>

<p>I am satisfied with your fixed up code for supporting MySQL 5.7 anyway. Thanks!</p>

<p>MySQL 5.7 does not support <code>JSON_TABLE</code> but supports <a href="https://dev.mysql.com/doc/refman/5.7/en/json.html" rel="nofollow"><code>JSON_ARRAY</code></a>.</p>

<p>I will try rewriting more better SQL with <code>JSON_ARRAY</code>. Please wait some days.</p>

									
								</div>
								<div class="raw-content hide">&gt; WordPress supports the latest MariaDB and Oracle MySQL fine, it&#39;s not against WordPress requirements to use something not ancient.

You are right. But WordPress support non latest DB, so shared hosting providers may use non latest DB for their convinience.

My shared hosting provider GMO DigiRock (CORESERVER) show them spec in here (https://www.coreserver.jp/spec/). They support MySQL 5.7 and PostgreSQL 9.6.

I selected PHP 7.3 for more stability than PHP 7.4.

&gt; Either way, I&#39;m sure there are plenty of shared hostings that do provide something newer than Oracle MySQL 5.7. There is this page: Web Hosting Providers Offering MariaDB for one thing.

Thanks for information. I saw MariaDB global supporting provider  in first time.

MariaDB is forked from MySQL 5.5. And non latest version, MySQL and MariaDB is high compatible.

GNU social v1.x supports MariaDB 5&#43;, so I wish keep compatibility for non latest DB...

I understand lengthy and less performance is not good for developer, but I think it is also important for supporting non latest DB for user.

I am satisfied with your fixed up code for supporting MySQL 5.7 anyway. Thanks!

MySQL 5.7 does not support `JSON_TABLE` but supports [`JSON_ARRAY`](https://dev.mysql.com/doc/refman/5.7/en/json.html).

I will try rewriting more better SQL with `JSON_ARRAY`. Please wait some days.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20957-write" data-preview="issuecomment-20957-preview" data-update-url="/diogo/gnu-social/comments/20957" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20958">
						<a class="avatar" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/XRevan86">XRevan86</a> commented <a href="#issuecomment-20958"><span class="time-since" title="Sun, 06 Sep 2020 23:56:50 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Collaborator
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>My shared hosting provider GMO DigiRock (CORESERVER) show them spec in here (<a href="https://www.coreserver.jp/spec/" rel="nofollow">https://www.coreserver.jp/spec/</a>).</p>
</blockquote>

<p>Didn&#39;t see that page…<br>
&#34;sqlight&#34; is an interesting option to have :-). So is &#34;python 2/3&#34; with no specifics.</p>

<blockquote>
<p>They support MySQL 5.7 and PostgreSQL 9.6.</p>
</blockquote>

<p>Oof, well, at least not PostgreSQL 9.2 as their other resources claim.</p>

<blockquote>
<p>I selected PHP 7.3 for more stability than PHP 7.4.</p>
</blockquote>

<p>Really doesn&#39;t matter unless there are some issues specific to the shared hosting.</p>

<blockquote>
<p>MariaDB is forked from MySQL 5.5. And non latest version, MySQL and MariaDB is high compatible.</p>
</blockquote>

<p>Compared to Oracle MySQL 5.7 new enough MariaDB is highly compatible, yes. Not in the other direction and not with Oracle MySQL 8.0 however.</p>

<blockquote>
<p>But WordPress support non latest DB, so shared hosting providers may use non latest DB for their convinience.</p>
</blockquote>

<p>It&#39;s like they don&#39;t want their customers to have the best coverage possible, seems self-defeating.</p>

<blockquote>
<p>MySQL 5.7 does not support <code>JSON_TABLE</code> but supports <a href="https://dev.mysql.com/doc/refman/5.7/en/json.html" rel="nofollow"><code>JSON_ARRAY</code></a>.<br>
I will try rewriting more better SQL with <code>JSON_ARRAY</code>. Please wait some days.</p>
</blockquote>

<p><code>JSON_ARRAY</code> is used <strong>with</strong> <code>JSON_TABLE</code>, you could try using <code>json_contains</code> and <code>json_search</code>, but without <code>WITH</code> or <a href="https://mariadb.com/kb/en/set-statement/" rel="nofollow"><code>SET STATEMENT</code></a> it is problematic not to send the key values twice.<br>
And won&#39;t be able to return exactly the tuples in order and amount requested, duplicates or not. But I added that just because it&#39;s easy with how it&#39;s done now, that can be removed, not that important.</p>

									
								</div>
								<div class="raw-content hide">&gt; My shared hosting provider GMO DigiRock (CORESERVER) show them spec in here (https://www.coreserver.jp/spec/).

Didn&#39;t see that page…  
&#34;sqlight&#34; is an interesting option to have :-). So is &#34;python 2/3&#34; with no specifics.  
&gt; They support MySQL 5.7 and PostgreSQL 9.6.

Oof, well, at least not PostgreSQL 9.2 as their other resources claim.  
&gt; I selected PHP 7.3 for more stability than PHP 7.4.

Really doesn&#39;t matter unless there are some issues specific to the shared hosting.  
&gt; MariaDB is forked from MySQL 5.5. And non latest version, MySQL and MariaDB is high compatible.

Compared to Oracle MySQL 5.7 new enough MariaDB is highly compatible, yes. Not in the other direction and not with Oracle MySQL 8.0 however.  
&gt; But WordPress support non latest DB, so shared hosting providers may use non latest DB for their convinience.

It&#39;s like they don&#39;t want their customers to have the best coverage possible, seems self-defeating.  
&gt; MySQL 5.7 does not support ```JSON_TABLE``` but supports [```JSON_ARRAY```](https://dev.mysql.com/doc/refman/5.7/en/json.html).  
&gt; I will try rewriting more better SQL with ```JSON_ARRAY```. Please wait some days.

```JSON_ARRAY``` is used **with** ```JSON_TABLE```, you could try using ```json_contains``` and ```json_search```, but without ```WITH``` or [```SET STATEMENT```](https://mariadb.com/kb/en/set-statement/) it is problematic not to send the key values twice.  
And won&#39;t be able to return exactly the tuples in order and amount requested, duplicates or not. But I added that just because it&#39;s easy with how it&#39;s done now, that can be removed, not that important.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20958-write" data-preview="issuecomment-20958-preview" data-update-url="/diogo/gnu-social/comments/20958" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20959">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-20959"><span class="time-since" title="Mon, 07 Sep 2020 03:14:28 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<p>Hi. I tried using <code>JSON_ARRAY</code>, but I gave up.</p>

<p>In my study, this answer (<a href="https://stackoverflow.com/questions/39906435/convert-json-array-in-mysql-to-rows/42153230#42153230" rel="nofollow">Convert JSON array in MySQL to rows - Stack Overflow</a>) is the nearest, but this answer needs multiple line <code>SELECT</code>. This is the same as <code>UNION ALL</code>. So I gave up.</p>

<p>Instead, I checked your fixed code on my server. I found a bug. Last 3 lines, <code>$join_keyword</code> variable is used, but <strong>this variable is not assigned</strong>. I replaced this to <code>RIGHT JOIN</code>, then code works well.</p>

<pre><code class="language-diff">+                $obj-&gt;_join = &#34;\n&#34; . sprintf(
+                    &#34;{$join_keyword} (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
+                    implode(&#39; UNION ALL &#39;, $vals_escaped)
</code></pre>

<p>After fix this bug, please commit it and close this issue.</p>

<p>Anyway, If it works on MySQL 5.7, there is no problem. Thanks!</p>

									
								</div>
								<div class="raw-content hide">Hi. I tried using `JSON_ARRAY`, but I gave up.

In my study, this answer ([Convert JSON array in MySQL to rows - Stack Overflow](https://stackoverflow.com/questions/39906435/convert-json-array-in-mysql-to-rows/42153230#42153230)) is the nearest, but this answer needs multiple line `SELECT`. This is the same as `UNION ALL`. So I gave up.

Instead, I checked your fixed code on my server. I found a bug. Last 3 lines, `$join_keyword` variable is used, but **this variable is not assigned**. I replaced this to `RIGHT JOIN`, then code works well.

``` diff
&#43;                $obj-&gt;_join = &#34;\n&#34; . sprintf(
&#43;                    &#34;{$join_keyword} (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
&#43;                    implode(&#39; UNION ALL &#39;, $vals_escaped)
```

After fix this bug, please commit it and close this issue.

Anyway, If it works on MySQL 5.7, there is no problem. Thanks!</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20959-write" data-preview="issuecomment-20959-preview" data-update-url="/diogo/gnu-social/comments/20959" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20965">
						<a class="avatar" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/XRevan86">XRevan86</a> commented <a href="#issuecomment-20965"><span class="time-since" title="Mon, 07 Sep 2020 16:30:09 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Collaborator
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<p>Pushed a test commit, please, try.</p>

									
								</div>
								<div class="raw-content hide">Pushed a test commit, please, try.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20965-write" data-preview="issuecomment-20965-preview" data-update-url="/diogo/gnu-social/comments/20965" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="event">
						<span class="octicon octicon-circle-slash"></span>
						<a class="ui avatar image" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<span class="text grey"><a href="/XRevan86">XRevan86</a> closed <a id="event-20966" href="#event-20966"><span class="time-since" title="Mon, 07 Sep 2020 16:30:09 UTC">2 months ago</span></a></span>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20981">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-20981"><span class="time-since" title="Tue, 08 Sep 2020 11:37:52 UTC">2 months ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<p><a href="/Xrevan86." rel="nofollow">@Xrevan86.</a> Thanks for commit. I checked your commit (4290ec312). MySQL 5.7 works well anyway.</p>

<p>But after this commit, my home time line needs <strong>some minutes</strong> for finishing page rendering. It is too slowly.</p>

<p>Previous <a href="https://notabug.org/diogo/gnu-social/commit/08145f635f8cf856fd66d9e29281b0c8ca3390a2" rel="nofollow">commit</a> + your last patch (with fixed bug in this issue) is OK (I checked).</p>

<p>But your commit (<a href="/diogo/gnu-social/commit/4290ec3120b4468093a446653ac3fd8147ec734e" rel="nofollow"><code>4290ec3120</code></a>) is a quite different and too many volume from this patch.</p>

<p>Also if there is no problem, difference is OK.</p>

<p>Your commit use some JSON functions. Is JSON functions heavy?</p>

<p>I was satisfied with your last patch. Why did you change commit from last patch?</p>

<p>If there is no problem, it is all OK how implementation.</p>

									
								</div>
								<div class="raw-content hide">@Xrevan86. Thanks for commit. I checked your commit (4290ec312). MySQL 5.7 works well anyway. 

But after this commit, my home time line needs **some minutes** for finishing page rendering. It is too slowly.

Previous [commit](https://notabug.org/diogo/gnu-social/commit/08145f635f8cf856fd66d9e29281b0c8ca3390a2) &#43; your last patch (with fixed bug in this issue) is OK (I checked).

But your commit (4290ec3120b4468093a446653ac3fd8147ec734e) is a quite different and too many volume from this patch.

Also if there is no problem, difference is OK.

Your commit use some JSON functions. Is JSON functions heavy?

I was satisfied with your last patch. Why did you change commit from last patch?

If there is no problem, it is all OK how implementation.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20981-write" data-preview="issuecomment-20981-preview" data-update-url="/diogo/gnu-social/comments/20981" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="event">
						<span class="octicon octicon-primitive-dot"></span>
						<a class="ui avatar image" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<span class="text grey"><a href="/senooken">senooken</a> reopened <a id="event-20982" href="#event-20982"><span class="time-since" title="Tue, 08 Sep 2020 11:37:52 UTC">2 months ago</span></a></span>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-20984">
						<a class="avatar" href="/XRevan86">
							<img src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/XRevan86">XRevan86</a> commented <a href="#issuecomment-20984"><span class="time-since" title="Wed, 09 Sep 2020 13:14:39 UTC">1 month ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Collaborator
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<blockquote>
<p>Your commit uses some JSON functions. Are JSON functions heavy?</p>
</blockquote>

<p><a href="/senooken" rel="nofollow">@senooken</a>, yes and no. Because <code>json_search</code> can only work with strings, I tried casting every integer, which is probably the bit that&#39;s failing miserably.</p>

									
								</div>
								<div class="raw-content hide">&gt; Your commit uses some JSON functions. Are JSON functions heavy?

@senooken, yes and no. Because ```json_search``` can only work with strings, I tried casting every integer, which is probably the bit that&#39;s failing miserably.</div>
								<div class="edit-content-zone hide" data-write="issuecomment-20984-write" data-preview="issuecomment-20984-preview" data-update-url="/diogo/gnu-social/comments/20984" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			
				

				
				
					<div class="comment" id="issuecomment-21021">
						<a class="avatar" href="/senooken">
							<img src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a">
						</a>
						<div class="content">
							<div class="ui top attached header">
								<span class="text grey"><a href="/senooken">SENOO, Ken</a> commented <a href="#issuecomment-21021"><span class="time-since" title="Fri, 11 Sep 2020 01:19:59 UTC">1 month ago</span></a></span>
								<div class="ui right actions">
									
										<div class="item tag">
											
												Poster
											
										</div>
									
									
								</div>
							</div>
							<div class="ui attached segment">
								<div class="render-content markdown has-emoji">
									
										<p>After your comment, it seems your commit (4290ec3120) was dropped out from commit history.</p>

<p>What did you think about this commit?</p>

<p>I think your last patch is OK ever last commit (adc689cb15). I want to include this patch.</p>

<p>Is there a problem? To make sure I show this patch again in following.</p>

<p>This patch can be imported to run <code>patch -p 1 &lt;[patch-file-name]</code> command in root directory (I think you know...).</p>

<pre><code class="language-diff">diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 0d22eb8628..d71afed57c 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -98,9 +98,18 @@ class Memcached_DataObject extends Safe_DataObject
         $db_type = common_config(&#39;db&#39;, &#39;type&#39;);
         if ($db_type === &#39;mysql&#39;) {
             $tmp_obj = new $cls();
-            $tmp_obj-&gt;query(&#39;SELECT 0 /*M! + 1 */ AS is_mariadb;&#39;);
-            if ($tmp_obj-&gt;fetch() &amp;&amp; $tmp_obj-&gt;is_mariadb) {
-                $db_type = &#39;mariadb&#39;;
+            $tmp_obj-&gt;query(
+                &lt;&lt;&lt;&#39;END&#39;
+                SELECT 0 /*M! + 1 */ AS is_mariadb,
+                    (0 /*!80001 + 1 */ /*M!100303 + 1 */) = 0 AS is_old_mysql;
+                END
+            );
+            if ($tmp_obj-&gt;fetch()) {
+                if ($tmp_obj-&gt;is_old_mysql) {
+                    $db_type = &#39;old_mysql&#39;;
+                } elseif ($tmp_obj-&gt;is_mariadb) {
+                    $db_type = &#39;mariadb&#39;;
+                }
             }
         }
 
@@ -114,11 +123,17 @@ class Memcached_DataObject extends Safe_DataObject
             } else {
                 $val_escaped = &#34;&#39;{$obj-&gt;escape($val)}&#39;&#34;;
             }
-            if ($db_type !== &#39;mariadb&#39;) {
-                $vals_escaped[] = $val_escaped;
+            if ($db_type === &#39;mariadb&#39;) {
+                 $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
+            } elseif ($db_type === &#39;old_mysql&#39;) {
+                if ($i == 0) {
+                    $vals_escaped[] = &#34;SELECT {$val_escaped} AS {$keyCol}, &#34;
+                                    . &#34;{$i} AS {$keyCol}_pos&#34;;
+                } else {
+                    $vals_escaped[] = &#34;SELECT {$val_escaped},{$i}&#34;;
+                }
             } else {
-                // A completely different approach for MariaDB (see below)
-                $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
+                $vals_escaped[] = $val_escaped;
             }
         }
 
@@ -161,6 +176,17 @@ class Memcached_DataObject extends Safe_DataObject
                     implode(&#39;,&#39;, $vals_escaped)
                 );
                 break;
+            case &#39;old_mysql&#39;:
+                // Delivers an empty set
+                if (count($vals_escaped) == 0) {
+                    $vals_escaped[] = &#34;SELECT NULL AS {$keyCol}, &#34;
+                                    . &#34;0 AS {$keyCol}_pos LIMIT 0&#34;;
+                }
+                $obj-&gt;_join = &#34;\n&#34; . sprintf(
+                    &#34;RIGHT JOJIN (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
+                    implode(&#39; UNION ALL &#39;, $vals_escaped)
+                );
+                break;
             case &#39;mysql&#39;:
             default:
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
</code></pre>

									
								</div>
								<div class="raw-content hide">After your comment, it seems your commit (4290ec3120) was dropped out from commit history.

What did you think about this commit?

I think your last patch is OK ever last commit (adc689cb15). I want to include this patch.

Is there a problem? To make sure I show this patch again in following.

This patch can be imported to run `patch -p 1 &lt;[patch-file-name]` command in root directory (I think you know...).


``` diff
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 0d22eb8628..d71afed57c 100644
--- a/classes/Memcached_DataObject.php
&#43;&#43;&#43; b/classes/Memcached_DataObject.php
@@ -98,9 &#43;98,18 @@ class Memcached_DataObject extends Safe_DataObject
         $db_type = common_config(&#39;db&#39;, &#39;type&#39;);
         if ($db_type === &#39;mysql&#39;) {
             $tmp_obj = new $cls();
-            $tmp_obj-&gt;query(&#39;SELECT 0 /*M! &#43; 1 */ AS is_mariadb;&#39;);
-            if ($tmp_obj-&gt;fetch() &amp;&amp; $tmp_obj-&gt;is_mariadb) {
-                $db_type = &#39;mariadb&#39;;
&#43;            $tmp_obj-&gt;query(
&#43;                &lt;&lt;&lt;&#39;END&#39;
&#43;                SELECT 0 /*M! &#43; 1 */ AS is_mariadb,
&#43;                    (0 /*!80001 &#43; 1 */ /*M!100303 &#43; 1 */) = 0 AS is_old_mysql;
&#43;                END
&#43;            );
&#43;            if ($tmp_obj-&gt;fetch()) {
&#43;                if ($tmp_obj-&gt;is_old_mysql) {
&#43;                    $db_type = &#39;old_mysql&#39;;
&#43;                } elseif ($tmp_obj-&gt;is_mariadb) {
&#43;                    $db_type = &#39;mariadb&#39;;
&#43;                }
             }
         }
 
@@ -114,11 &#43;123,17 @@ class Memcached_DataObject extends Safe_DataObject
             } else {
                 $val_escaped = &#34;&#39;{$obj-&gt;escape($val)}&#39;&#34;;
             }
-            if ($db_type !== &#39;mariadb&#39;) {
-                $vals_escaped[] = $val_escaped;
&#43;            if ($db_type === &#39;mariadb&#39;) {
&#43;                 $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
&#43;            } elseif ($db_type === &#39;old_mysql&#39;) {
&#43;                if ($i == 0) {
&#43;                    $vals_escaped[] = &#34;SELECT {$val_escaped} AS {$keyCol}, &#34;
&#43;                                    . &#34;{$i} AS {$keyCol}_pos&#34;;
&#43;                } else {
&#43;                    $vals_escaped[] = &#34;SELECT {$val_escaped},{$i}&#34;;
&#43;                }
             } else {
-                // A completely different approach for MariaDB (see below)
-                $vals_escaped[] = &#34;({$val_escaped},{$i})&#34;;
&#43;                $vals_escaped[] = $val_escaped;
             }
         }
 
@@ -161,6 &#43;176,17 @@ class Memcached_DataObject extends Safe_DataObject
                     implode(&#39;,&#39;, $vals_escaped)
                 );
                 break;
&#43;            case &#39;old_mysql&#39;:
&#43;                // Delivers an empty set
&#43;                if (count($vals_escaped) == 0) {
&#43;                    $vals_escaped[] = &#34;SELECT NULL AS {$keyCol}, &#34;
&#43;                                    . &#34;0 AS {$keyCol}_pos LIMIT 0&#34;;
&#43;                }
&#43;                $obj-&gt;_join = &#34;\n&#34; . sprintf(
&#43;                    &#34;RIGHT JOJIN (%s) AS {$join_tablename} USING ({$keyCol})&#34;,
&#43;                    implode(&#39; UNION ALL &#39;, $vals_escaped)
&#43;                );
&#43;                break;
             case &#39;mysql&#39;:
             default:
                 $obj-&gt;_join = &#34;\n&#34; . sprintf(
```</div>
								<div class="edit-content-zone hide" data-write="issuecomment-21021-write" data-preview="issuecomment-21021-preview" data-update-url="/diogo/gnu-social/comments/21021" data-context="/diogo/gnu-social"></div>
							</div>
							
						</div>
					</div>
				

			

			

			
				<div class="ui warning message">
					<a href="/user/login?redirect_to=/diogo/gnu-social/issues/206">Sign in</a> to join this conversation.
				</div>
			
		</ui>
	</div>

	<div class="four wide column">
		<div class="ui segment metas">
			<div class="ui disabled floating jump select-label dropdown">
				<span class="text">
					<strong>Labels</strong>
					<span class="octicon octicon-gear"></span>
				</span>
				<div class="filter menu" data-action="update" data-update-url="/diogo/gnu-social/issues/206/label">
					<div class="no-select item">Clear labels</div>
					
						<a class=" item" href="#" data-id="1564" data-id-selector="#label_1564"><span class="octicon "></span><span class="label color" style="background-color: #fbca04"></span> bounty</a>
					
						<a class=" item" href="#" data-id="1483" data-id-selector="#label_1483"><span class="octicon "></span><span class="label color" style="background-color: #ee0701"></span> bug</a>
					
						<a class=" item" href="#" data-id="1484" data-id-selector="#label_1484"><span class="octicon "></span><span class="label color" style="background-color: #cccccc"></span> duplicate</a>
					
						<a class=" item" href="#" data-id="1485" data-id-selector="#label_1485"><span class="octicon "></span><span class="label color" style="background-color: #84b6eb"></span> enhancement</a>
					
						<a class=" item" href="#" data-id="1486" data-id-selector="#label_1486"><span class="octicon "></span><span class="label color" style="background-color: #128a0c"></span> help wanted</a>
					
						<a class=" item" href="#" data-id="1487" data-id-selector="#label_1487"><span class="octicon "></span><span class="label color" style="background-color: #e6e6e6"></span> invalid</a>
					
						<a class=" item" href="#" data-id="1488" data-id-selector="#label_1488"><span class="octicon "></span><span class="label color" style="background-color: #cc317c"></span> question</a>
					
						<a class=" item" href="#" data-id="1565" data-id-selector="#label_1565"><span class="octicon "></span><span class="label color" style="background-color: #d4c5f9"></span> RFC</a>
					
						<a class=" item" href="#" data-id="1841" data-id-selector="#label_1841"><span class="octicon "></span><span class="label color" style="background-color: #0052cc"></span> v3</a>
					
						<a class=" item" href="#" data-id="1489" data-id-selector="#label_1489"><span class="octicon "></span><span class="label color" style="background-color: #ffffff"></span> wontfix</a>
					
				</div>
			</div>
			<div class="ui labels list">
				<span class="no-select item ">No Label</span>
				
					<div class="item">
						<a class="ui label hide" id="label_1564" href="/diogo/gnu-social/issues?labels=1564" style="color: #000; background-color: #fbca04">bounty</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1483" href="/diogo/gnu-social/issues?labels=1483" style="color: #fff; background-color: #ee0701">bug</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1484" href="/diogo/gnu-social/issues?labels=1484" style="color: #000; background-color: #cccccc">duplicate</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1485" href="/diogo/gnu-social/issues?labels=1485" style="color: #000; background-color: #84b6eb">enhancement</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1486" href="/diogo/gnu-social/issues?labels=1486" style="color: #fff; background-color: #128a0c">help wanted</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1487" href="/diogo/gnu-social/issues?labels=1487" style="color: #000; background-color: #e6e6e6">invalid</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1488" href="/diogo/gnu-social/issues?labels=1488" style="color: #fff; background-color: #cc317c">question</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1565" href="/diogo/gnu-social/issues?labels=1565" style="color: #000; background-color: #d4c5f9">RFC</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1841" href="/diogo/gnu-social/issues?labels=1841" style="color: #fff; background-color: #0052cc">v3</a>
					</div>

				
					<div class="item">
						<a class="ui label hide" id="label_1489" href="/diogo/gnu-social/issues?labels=1489" style="color: #000; background-color: #ffffff">wontfix</a>
					</div>

				
			</div>

			<div class="ui divider"></div>

			<div class="ui disabled floating jump select-milestone dropdown">
				<span class="text">
					<strong>Milestone</strong>
					<span class="octicon octicon-gear"></span>
				</span>
				<div class="menu" data-action="update" data-update-url="/diogo/gnu-social/issues/206/milestone">
					<div class="no-select item">Clear milestone</div>
					
					
				</div>
			</div>
			<div class="ui select-milestone list">
				<span class="no-select item ">No Milestone</span>
				<div class="selected">
					
				</div>
			</div>

			<div class="ui divider"></div>

			<input id="assignee_id" name="assignee_id" type="hidden" value="">
			<div class="ui disabled floating jump select-assignee dropdown">
				<span class="text">
					<strong>Assignee</strong>
					<span class="octicon octicon-gear"></span>
				</span>
				<div class="menu" data-action="update" data-update-url="/diogo/gnu-social/issues/206/assignee">
					<div class="no-select item">Clear assignee</div>
					
				</div>
			</div>
			<div class="ui select-assignee list">
				<span class="no-select item ">No assignee</span>
				<div class="selected">
					
				</div>
			</div>

			<div class="ui divider"></div>

			<div class="ui participants">
				<span class="text"><strong>2 Participants</strong></span>
				<div>
					
						<a href="/senooken">
							<img class="ui avatar image poping up" src="https://seccdn.libravatar.org/avatar/5349e716212163fd511dfe106ff42e0a" data-content="SENOO, Ken" data-position="top center" data-variation="small inverted">
						</a>
					
						<a href="/XRevan86">
							<img class="ui avatar image poping up" src="https://seccdn.libravatar.org/avatar/be64a3cf684f74eecd530b6d69cde332" data-content="XRevan86" data-position="top center" data-variation="small inverted">
						</a>
					
				</div>
			</div>
		</div>
	</div>
</div>

<div class="hide" id="edit-content-form">
	<div class="ui comment form">
		<div class="ui top attached tabular menu">
			<a class="active write item">Write</a>
			<a class="preview item" data-url="/api/v1/markdown" data-context="/diogo/gnu-social">Preview</a>
		</div>
		<div class="ui bottom attached active write tab segment">
			<textarea tabindex="1" id="content" name="content"></textarea>
		</div>
		<div class="ui bottom attached tab preview segment markdown">
			Loading...
		</div>
		<div class="text right edit buttons">
			<div class="ui basic blue cancel button" tabindex="3">Cancel</div>
			<div class="ui green save button" tabindex="2">Save</div>
		</div>
	</div>
</div>

<div class="hide" id="no-content">
	<span class="no-content">There is no content yet.</span>
</div>

			</div>
		
	</div>
</div>

	</div>
	<footer>
		<div class="ui container">
			<div class="ui left">



				<a href="/tos">Terms of Service</a>
				&bull;
				<a href="/about">About us</a>
				&bull;
				<a href="/outages">Outages</a>
				&bull;
				<a href="/hp/gogs/issues">Report a problem</a>
				&bull;
				<a href="/assets/librejs/librejs.html" data-jslicense="1">Javascript licenses</a>
				&bull;
				<a href="/fingerprints">SSH Fingerprints</a>



			</div>
			<div class="ui right links">
				
				<div class="ui language bottom floating slide up dropdown link item">
					<i class="world icon"></i>
					<div class="text">English</div>
					<div class="menu">
						
							<a class="item active selected" href="#">English</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=zh-CN">简体中文</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=zh-HK">繁體中文（香港）</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=zh-TW">繁體中文（臺灣）</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=de-DE">Deutsch</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=fr-FR">français</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=nl-NL">Nederlands</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=lv-LV">latviešu</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=ru-RU">русский</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=ja-JP">日本語</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=es-ES">español</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=pt-BR">português do Brasil</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=pl-PL">polski</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=bg-BG">български</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=it-IT">italiano</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=fi-FI">suomi</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=tr-TR">Türkçe</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=cs-CZ">čeština</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=sr-SP">српски</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=sv-SE">svenska</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=ko-KR">한국어</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=gl-ES">galego</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=uk-UA">українська</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=en-GB">English (United Kingdom)</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=hu-HU">Magyar</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=sk-SK">Slovenčina</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=id-ID">Indonesian</a>
						
							<a class="item " href="/diogo/gnu-social/issues/206?lang=fa-IR">Persian</a>
						
					</div>
				</div>



				
			</div>
		</div>
	</footer>
</body>



	<link rel="stylesheet" href="/plugins/highlight-9.6.0/github.css">
	<script src="/plugins/highlight-9.6.0/highlight.pack.js"></script>




	<link rel="stylesheet" href="/plugins/dropzone-4.2.0/dropzone.css">
	<script src="/plugins/dropzone-4.2.0/dropzone.js"></script>

<script src="/js/libs/emojify-1.1.0.min.js"></script>
<script src="/js/libs/clipboard-1.5.9.min.js"></script>
	
</html>

